Dalam C++, setiap ekspresi menghasilkan salah satu dari lvalue atau rvalue. Perbedaan ini menentukan apakah suatu ekspresi merujuk pada objek yang memiliki identitas (di mana letaknya) atau nilainya nilai (apa yang dikandungnya).
1. Identitas vs Isi
Sebuah lvalue (nilai lokasi) mewakili objek dengan alamat memori yang tetap. Bayangkan sebagai kotak bertanda di RAM. Sebaliknya, sebuah rvalue (nilai bacaan) bersifat sementara; ia mewakili hasil sementara atau nilai konstan yang tidak memiliki alamat yang dapat diakses oleh pemrogram.
2. Transisi Fungsional
Sementara lvalue dapat berperan sebagai rvalue (kompiler hanya mengambil nilai di dalam kotak), sebaliknya dilarang. Anda tidak dapat menggunakan rvalue saat dibutuhkan lvalue—misalnya, Anda tidak dapat mengambil alamat dari angka konstan seperti &42 karena tidak memiliki identitas yang tetap.
$$ \text{Lvalue} \xrightarrow{\text{Konversi}} \text{Rvalue} \quad (\text{Diizinkan}) $$
$$ \text{Rvalue} \xrightarrow{\text{Penugasan}} \text{Lvalue} \quad (\text{Dilarang}) $$